package plugin.bpce.Telas;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;

import plugin.bpce.Object.InterfaceCoppeer;
import plugin.bpce.Object.ModelObject;
import plugin.bpce.modelo.DadosCoppeer;
import plugin.bpce.modelo.ModeloAvaliado;
import plugin.bpce.util.ImportaDiagramas;

public class TelaPulbicarDiagrama extends ApplicationWindow implements SelectionListener{
	private Text txtNomeDiagrama, txtNomeUsuario;
	private Button btExportar, btCancelar;	
	private String NomeDiagrama, coppeerHome, PathProjeto, nomeUsuario, portaCoppeer;    
    private Shell Tela;
    private File arqTela, ArqImagem;    
    private ModelObject MO; 
    private ImportaDiagramas impDiagramas;
    private Table TabelaDiagramasUsados;
    private boolean avaliou;
    private Map<String, String> mapaAutorModelo; 
    private List<ModeloAvaliado> modelosAvaliados;
	
	public TelaPulbicarDiagrama(Shell parent, String NomeDiagrama, File Arquivo, String PathProjeto, 
			DadosCoppeer dados, File imagem) {		
		super(parent);		
		
		FileDialog fileImagem;
				
		this.Tela = parent;
		this.arqTela = Arquivo;
		this.PathProjeto = PathProjeto;
		this.nomeUsuario = dados.getNomeUsuario();		
		this.NomeDiagrama = NomeDiagrama;
		this.portaCoppeer = dados.getPorta();
		
		if (imagem == null){
			fileImagem = new FileDialog(parent, SWT.OPEN);
			fileImagem.setText("Select image file");			
			this.ArqImagem = new File(fileImagem.open());
		}
		else
			this.ArqImagem = imagem;			
			
		this.coppeerHome = dados.getCoppeerHome();				
	}
	
	protected Control createContents(Composite parent) {
		CLabel lblNomeModelo, lblNomeUsuario;
		GridData LayoutbtExportar, LayoutEdit, LayoutRadioData, LayoutLabel, LayoutLabel2;
		GridLayout LayoutTela, LayoutSuperior, LayoutGrupoBotoes, LayoutRadios;
		Group main, GrupoSuperior, GrupoBotoes, GrupoGrid;				
		TableColumn ColunaNomeModelo, ColunaNotaModelo;		
		int i;
		String impNomeModelo[];
		TableItem tableItem;
		TableEditor teNomeModelo, teRelevancia;
		Text txtNomeModeloImp;
		Button[] radio;		
		Composite comp;
		
		parent.getShell().setText("Publish Model");
		
		LayoutTela = new GridLayout();
		LayoutTela.numColumns = 1;		
		
		main = new Group(parent, SWT.APPLICATION_MODAL);
		main.setLayoutData(new GridData(GridData.FILL_BOTH));		
		main.setLayout(LayoutTela);
		
		LayoutSuperior = new GridLayout();
		LayoutSuperior.numColumns = 2;		
		
		GrupoSuperior = new Group(main, SWT.NONE);
		GrupoSuperior.setLayout(LayoutSuperior);	
		GrupoSuperior.setText("Information of Model");		
		
		LayoutEdit = new GridData();
		LayoutEdit.heightHint = -1;
		LayoutEdit.widthHint = 230;	
		
		LayoutLabel = new GridData();
		LayoutLabel.horizontalAlignment = SWT.RIGHT;
		LayoutLabel.widthHint = 75;
		
		LayoutLabel2 = new GridData();
		LayoutLabel2.horizontalAlignment = SWT.RIGHT;
		LayoutLabel2.widthHint = 70;
		
		lblNomeModelo = new CLabel(GrupoSuperior, SWT.NONE);		
		lblNomeModelo.setText("Model's Name:");
		lblNomeModelo.setLayoutData(LayoutLabel);
		
		txtNomeDiagrama = new Text(GrupoSuperior, SWT.BORDER);
		txtNomeDiagrama.setOrientation(33554432);
		txtNomeDiagrama.setLayoutData(LayoutEdit);
		txtNomeDiagrama.setText(this.NomeDiagrama);
		txtNomeDiagrama.setTextLimit(40);
		txtNomeDiagrama.setEditable(true);
		
		lblNomeUsuario = new CLabel(GrupoSuperior, SWT.NONE);
		lblNomeUsuario.setText("Modeler's Name:");		
		
		txtNomeUsuario = new Text(GrupoSuperior, SWT.BORDER);
		txtNomeUsuario.setLayoutData(LayoutEdit);
		txtNomeUsuario.setText(this.nomeUsuario);
		txtNomeUsuario.setEditable(true);
		
		GrupoGrid = new Group(main, SWT.NONE);
		GrupoGrid.setText("Used Models");			
		
		TabelaDiagramasUsados =  new Table(GrupoGrid, SWT.BORDER);				
		TabelaDiagramasUsados.setHeaderVisible(true);		
		TabelaDiagramasUsados.setLinesVisible(true);		
		TabelaDiagramasUsados.setBounds(new org.eclipse.swt.graphics.Rectangle(10,20,340,70));
		
		ColunaNomeModelo = new TableColumn(TabelaDiagramasUsados, SWT.NONE);
		ColunaNomeModelo.setWidth(200);		
		ColunaNomeModelo.setText("Model's Name");
		
		ColunaNotaModelo = new TableColumn(TabelaDiagramasUsados, SWT.NONE);
		ColunaNotaModelo.setWidth(130);
		ColunaNotaModelo.setText("Relevance");
		
		impDiagramas = new ImportaDiagramas(this.PathProjeto);
		impNomeModelo = impDiagramas.getNomeDiagramasImportados();
		radio = new Button[4];
		
		LayoutRadioData = new GridData();
		LayoutRadioData.heightHint = 10;
	
		for(i = 0; i < impNomeModelo.length; i++){
			tableItem = new TableItem(TabelaDiagramasUsados, SWT.NONE);
			
			txtNomeModeloImp = new Text(TabelaDiagramasUsados, SWT.READ_ONLY);
			txtNomeModeloImp.setText(impNomeModelo[i]);			
			txtNomeModeloImp.pack();
			
			teNomeModelo = new TableEditor(TabelaDiagramasUsados);
			teNomeModelo.minimumWidth = txtNomeModeloImp.getSize().x;			
			teNomeModelo.horizontalAlignment = SWT.LEFT;
			teNomeModelo.setEditor(txtNomeModeloImp, tableItem, 0);
			
			LayoutRadios = new GridLayout();
			LayoutRadios.numColumns = 4;
			LayoutRadios.makeColumnsEqualWidth = true;
			LayoutRadios.marginHeight = 0;
			LayoutRadios.marginWidth = 0;
			LayoutRadios.marginTop = 3;
			LayoutRadios.marginBottom = 0;
			
			comp = new Composite(TabelaDiagramasUsados, SWT.NONE);
			comp.setBackground(tableItem.getParent().getBackground());
			comp.setBackgroundMode(SWT.INHERIT_DEFAULT);
			comp.setLayout(LayoutRadios);
			
			radio[0] = new Button(comp, SWT.RADIO);
			radio[0].setText("0");
			radio[0].setLayoutData(LayoutRadioData);
			radio[0].pack();
			
			radio[1] = new Button(comp, SWT.RADIO);
			radio[1].setText("1");
			radio[1].setLayoutData(LayoutRadioData);
			radio[1].pack();
			
			radio[2] = new Button(comp, SWT.RADIO);
			radio[2].setText("2");
			radio[2].setLayoutData(LayoutRadioData);
			radio[2].pack();
			
			radio[3] = new Button(comp, SWT.RADIO);
			radio[3].setText("3");
			radio[3].setLayoutData(LayoutRadioData);
			radio[3].pack();

			comp.pack();
			
			teRelevancia = new TableEditor(TabelaDiagramasUsados);
			teRelevancia.minimumWidth = comp.getSize().x;
			teRelevancia.setEditor(comp, tableItem, 1);
		}		
		
		LayoutGrupoBotoes = new GridLayout();
		LayoutGrupoBotoes.numColumns = 2;		
		
		GrupoBotoes = new Group(main, SWT.NONE);
		GrupoBotoes.setLayout(LayoutGrupoBotoes);
		
		LayoutbtExportar = new GridData();
		LayoutbtExportar.horizontalAlignment = org.eclipse.swt.layout.GridData.END;		
		
		btExportar = new Button(GrupoBotoes, SWT.NONE);
		btExportar.setText("Publish");
		btExportar.setLayoutData(LayoutbtExportar);		
		btExportar.addSelectionListener(this);
		
		btCancelar = new Button(GrupoBotoes, SWT.NONE);
		btCancelar.setText("Cancel");
		btCancelar.addSelectionListener(this);
		
		return parent;
	}	
	
	public void widgetSelected(SelectionEvent e){		
		Properties prop;
		boolean resposta;
		InterfaceCoppeer coppeer;
		
		if (e.getSource().equals(btCancelar)){			
			this.close();
		}
		
		if (e.getSource().equals(btExportar)) {
			int i;			
			
			if (ValidaCampos()){
				this.MO = new ModelObject(this.txtNomeDiagrama.getText(), this.NomeDiagrama, 
						this.coppeerHome, this.txtNomeUsuario.getText(), this.ArqImagem);
				
				if (this.MO.VerificaExisteMO())
					resposta = MessageDialog.openQuestion(this.Tela, "BPCE", "Exists a diagram with the name indicated in the repository, desires to modify it?");
				else
					resposta = true;
				
				if (resposta) { 
					verificaAvaliacao();
					
					this.MO.GeraMO(this.arqTela);					
					this.MO.GravaArquivo();
					this.MO.GeraZip();
					
					prop = new Properties();
					prop.setProperty("Tipo", "1");					
					
					if (this.avaliou)
						prop.setProperty("Avaliou", "1");
					else
						prop.setProperty("Avaliou", "0");
					
					prop.setProperty("NomeDiagrama", this.txtNomeDiagrama.getText());
					prop.setProperty("NomeAutor", this.txtNomeUsuario.getText());									
					
					if (this.modelosAvaliados != null){
						for(i = 0; i < this.modelosAvaliados.size(); i++){
							ModeloAvaliado modelo = this.modelosAvaliados.get(i);
							String nomeModelo = modelo.getNomeModelo();
							String nomeAutor = modelo.getNomeAutor();
							String pto = Integer.toString(modelo.getPontuacao());
							
							prop.setProperty("uDiagrama" + Integer.toString(i), nomeModelo);
							prop.setProperty("uAutor" + Integer.toString(i), nomeAutor);
							prop.setProperty("uAvaliacao" + Integer.toString(i), pto);
						}
					}						
					
					coppeer = new InterfaceCoppeer();
					coppeer.publicaModelo(prop, this.portaCoppeer);
					
					this.close();
				}
			}			
		}
	}
	
	private void verificaAvaliacao(){
		Composite conjuntoRadio;
		int i, j;
		Button radio;
		Text txtNomeModeloImp;
		String nomeModelo, nomeAutor;
		ModeloAvaliado temp;
		
		this.avaliou = false;		
		mapaAutorModelo = this.impDiagramas.getMapaModelosImportados();		
		modelosAvaliados = new ArrayList<ModeloAvaliado>();
		
		for(i = 1; i < this.TabelaDiagramasUsados.getChildren().length; i = i + 2){
			conjuntoRadio = (Composite) TabelaDiagramasUsados.getChildren()[i];
			txtNomeModeloImp = (Text) TabelaDiagramasUsados.getChildren()[i-1];
			nomeModelo = txtNomeModeloImp.getText();
			nomeAutor = mapaAutorModelo.get(nomeModelo);
						
			for(j = 0; j < 4; j++){
				radio = (Button) conjuntoRadio.getChildren()[(int)j];
				
				if (radio.getSelection()){					
					this.avaliou = true;
					temp = new ModeloAvaliado();
					temp.setNomeAutor(nomeAutor);
					temp.setNomeModelo(nomeModelo);
					temp.setNomePontuador(this.txtNomeUsuario.getText());
					temp.setPontuacao(j);					
					modelosAvaliados.add(temp);
					break;
				}
			}
		}
		
		if (this.modelosAvaliados != null)
			this.impDiagramas.apagaImportacao(this.modelosAvaliados);
	}

	public boolean ValidaCampos(){		
		if (this.txtNomeDiagrama.getText().length() == 0){
			MessageDialog.openError(this.Tela, "BPCE", "The field Name of the Diagram cannot be null.");
			return false;
		}		
		else if (this.txtNomeUsuario.getText().length() == 0){
			MessageDialog.openError(this.Tela, "BPCE", "The field Name of the Modeller cannot be null.");
			return false;
		}
		
		return true;		
	}
	
	public void widgetDefaultSelected(SelectionEvent e){
		
	}
}